uvloopで asyncio を高速化してみよう
uvloop について
uvloopは、Python 標準ライブラリのasyncioイベントループを置き換えるモジュールで、非常に高速な処理ができることが特徴です。 uvloopはCythonに実装されてiて、内部では libuvライブラリを使用しています。
asyncio と uvloop
PEP 3156によって導入されたasyncioモジュールは、ネットワークトランスポート、プロトコル、およびストリームの抽象化のコレクションであり、プラグ可能なイベントループを備えています。 イベントループはasyncioのコアな機能で、 次のAPIを提供します。
実行のスケジューリング
ネットワーク経由でのデータを送信し
DNSクエリの実行
OSのシグナルのハンドリング処理
サーバーと接続を作成するための便利な抽象化クラス
サブプロセスを非同期で操作
現時点では、uvloopはLinux系プラットフォームで使用できます。
uvloop のインストール
uvloopは、pipでインストールできます
code: bash
$ pip install uvloop
uvloop の利用方法
uvloop の利用方法はとても簡単で次のコードを呼び出しておくだけです。
code: python
import asyncio
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
あとは、asyncio でいつものようにイベントループを取得します。
code: python
asyncio.get_event_loop()
これだけで、asyncio が 2〜4倍高速になります。
https://gyazo.com/176ae257d1654ccbf3ad15d9356ac450
このグラフは、さまざまなメッセージサイズのエコーサーバーのパフォーマンスを示しています。 ソケットベンチマークは、loop.sock_recv()メソッドとloop.sock_sendall()メソッドを使用しています。 ストリームベンチマークは、asyncio.start_server()関数によって作成されたasyncio高レベルストリームを使用しています。 プロトコルベンチマークは、単純なエコープロトコルでloop.create_server()を使用しています。
参考